package com.atguigu.myjuc.cas;

import java.util.concurrent.atomic.AtomicInteger;

public class CasHello {
    /*
    * ABA 问题：
其他线程可能将值从 A→B→A，导致 CAS 误判未修改。
解决方案：使用 AtomicStampedReference 附加版本号。

自旋开销：
高并发下频繁失败可能导致 CPU 空转，需配合退避策略。

单一变量限制：
CAS 只能保证一个变量的原子性，复合操作需用 synchronized 或 Lock。

*/
    public static void main(String[] args) {
        AtomicInteger atomicInteger = new AtomicInteger(3);
        System.out.println(atomicInteger.get());
        atomicInteger.addAndGet(3);
        System.out.println("atomicInteger = " + atomicInteger);
        System.out.println(atomicInteger.get());

        //比对当前值 true false  修改值     比对正确修改
        System.out.println(atomicInteger.compareAndSet(6,369)+"\t"+atomicInteger.get());
        System.out.println(atomicInteger.compareAndSet(6,333)+"\t"+atomicInteger.get());


        System.out.println(atomicInteger.incrementAndGet()); //++i  370
        System.out.println(atomicInteger.addAndGet(2)); //增长获取
        atomicInteger.set(3);//直接设置新值
        System.out.println("atomicInteger = " + atomicInteger);
        System.out.println(atomicInteger.getAndSet(6));//直接修改新值并返回旧值
        System.out.println(atomicInteger.get());
        System.out.println(atomicInteger.getAndIncrement());//i++ 6
        System.out.println("atomicInteger = " + atomicInteger);//7
        System.out.println(atomicInteger.decrementAndGet());//--i 6



    }
}
